﻿/* 大陆地区代码表
 */

namespace LSLib.Collections
{
    using System;
    using System.Collections;

    public static class DistrictCodeTable
    {
        /// <summary>地区代码返回结果类型：Simple(简称)、Full(全称)
        /// </summary>
        public enum ResultType
        {
            /// <summary>简称
            /// </summary>
            Simple,
            /// <summary>全称
            /// </summary>
            Full,
        }

        /// <summary>地区代码：简称
        /// </summary>
        public static Hashtable GetDistrictTable_Simple()
        {
            Hashtable tb = new Hashtable();

            //11-15 京、津、冀、晋、蒙 
            tb.Add("11", "京");
            tb.Add("12", "津");
            tb.Add("13", "冀");
            tb.Add("14", "晋");
            tb.Add("15", "蒙");
            //21-23 辽、吉、黑 
            tb.Add("21", "辽");
            tb.Add("22", "吉");
            tb.Add("23", "黑");
            //31-37 沪、苏、浙、皖、闽、赣、鲁 
            tb.Add("31", "沪");
            tb.Add("32", "苏");
            tb.Add("33", "浙");
            tb.Add("34", "皖");
            tb.Add("35", "闽");
            tb.Add("36", "赣");
            tb.Add("37", "鲁");
            //41-46 豫、鄂、湘、粤、桂、琼 
            tb.Add("41", "豫");
            tb.Add("42", "鄂");
            tb.Add("43", "湘");
            tb.Add("44", "粤");
            tb.Add("45", "桂");
            tb.Add("46", "琼");
            //50-54 渝、川、贵、云、藏 
            tb.Add("50", "渝");
            tb.Add("51", "川");
            tb.Add("52", "贵");
            tb.Add("53", "云");
            tb.Add("54", "藏");
            //61-65 陕、甘、青、宁、新 
            tb.Add("61", "陕");
            tb.Add("62", "甘");
            tb.Add("63", "青");
            tb.Add("64", "宁");
            tb.Add("65", "新");
            //71 台湾
            tb.Add("71", "台");
            //81-82 港、澳 
            tb.Add("81", "港");
            tb.Add("82", "澳");
            //91 国外
            tb.Add("91", "外");

            return tb;
        }

        /// <summary>地区代码：全称
        /// </summary>
        public static Hashtable GetDistrictTable_Full()
        {
            Hashtable tb = new Hashtable();

            //11-15 京、津、冀、晋、蒙 
            tb.Add("11", "北京");
            tb.Add("12", "天津");
            tb.Add("13", "河北");
            tb.Add("14", "山西");
            tb.Add("15", "内蒙古");
            //21-23 辽、吉、黑 
            tb.Add("21", "辽宁");
            tb.Add("22", "吉林");
            tb.Add("23", "黑龙江");
            //31-37 沪、苏、浙、皖、闽、赣、鲁 
            tb.Add("31", "上海");
            tb.Add("32", "江苏");
            tb.Add("33", "浙江");
            tb.Add("34", "安徽");
            tb.Add("35", "福建");
            tb.Add("36", "江西");
            tb.Add("37", "山东");
            //41-46 豫、鄂、湘、粤、桂、琼 
            tb.Add("41", "河南");
            tb.Add("42", "湖北");
            tb.Add("43", "湖南");
            tb.Add("44", "广东");
            tb.Add("45", "广西");
            tb.Add("46", "海南");
            //50-54 渝、川、贵、云、藏 
            tb.Add("50", "重庆");
            tb.Add("51", "四川");
            tb.Add("52", "贵州");
            tb.Add("53", "云南");
            tb.Add("54", "西藏");
            //61-65 陕、甘、青、宁、新 
            tb.Add("61", "陕西");
            tb.Add("62", "甘肃");
            tb.Add("63", "青海");
            tb.Add("64", "宁夏");
            tb.Add("65", "新疆");
            //71 台湾
            tb.Add("71", "台湾");
            //81-82 港、澳 
            tb.Add("81", "香港");
            tb.Add("82", "澳门");
            //91 国外
            tb.Add("91", "国外");

            return tb;
        }

        /// <summary>通过两位地区码得到对应的地区名称
        /// </summary>
        /// <param name="code">两位地区码</param>
        /// <param name="resType">返回类型：Simple(简称)、Full(全称)</param>
        /// <returns>对应的地区名称</returns>
        public static string GetDistrictCode(string code, ResultType resType)
        {
            if (code.Length != 2) throw new ArgumentException("地区代码的长度应该等于2。");

            Hashtable districtTB = getNewDistrictTable(resType);

            if (!districtTB.ContainsKey(code)) throw new Exception("地区代码不存在！");
            return districtTB[code].ToString();
        }
        private static Hashtable getNewDistrictTable(ResultType type)
        {
            switch (type)
            {
                case ResultType.Simple:
                    return GetDistrictTable_Simple();
                case ResultType.Full:
                    return GetDistrictTable_Full();
                default:
                    throw new ArgumentException("ResultType is not right.");
            }
        }
    }
}